{{tag>Lucid Precise serveur logiciels services}}

====== Comment transformer un programme en service. ======

===== Définition =====

Service est traduit en anglais par daemon.

Qu'est-ce qu'un daemon ?

[Unix] Originellement DAEMON, Brit. pour « Disk And Execution MONitor ». Programme réalisant des tâches de fond du système, sous Unix. Appelé aussi driver sur d'autres systèmes. En temps normal, son fonctionnement ne doit pas être remarqué par l'utilisateur. Un démon peut aussi être un sous-programme appelé par un programme principal (dans ce cas on parle « sérieusement » de bibliothèque partagée)

===== Pourquoi ce tutoriel? =====

Il est parfois nécessaire de transformer un programme en daemon, surtout lors de mise en place de serveur. Par exemple, les serveurs de jeux, ou des programmes de téléchargement automatique tel que SABnzbd. Le problème est que les scripts pour « daemonizer » que l'on trouve sur internet, sont mal conçus, voire dangereux pour le système en cas de mauvaise utilisation.

===== Mise en place =====

Il faut d'abord créer un script sh que nous appellerons dans notre exemple SABnzbd.py. Le nom ici donné est tout à fait arbitraire. Généralement, par facilité, on préférera lui donner le même nom que le programme que l'on va transformer en démon.

attention: il faut au préalable avoir rendu ce [[tutoriel:script_shell|programme exécutable]].

Pour cela, on lance son [[:editeur_de_texte|éditeur]] favori, soit [[:nano]] ou [[:vim]] en ligne de commande, soit [[:gedit]], [[:kate]] ou [[:mousepad]].

==== Script ====

On utilise proprement start-stop-daemon qui permet de transformer n'importe quel programme en démon.

Exemple pour SABnzbd :

<note important>Configurer correctement l'entête du script en fonction de votre utilisation!</note>

<file>
#! /bin/sh -e

DAEMON="/opt/SABnzbd-0.4.11/SABnzbd.py" #ligne de commande du programme
daemon_OPT="-d -p -f /home/jfb/SABnzbd/sabnzbd.ini"  #argument à utiliser par le programme
DAEMONUSER="user" #utilisateur du programme
daemon_NAME="SABnzbd.py" #Nom du programme (doit être identique à l'exécutable)

PATH="/sbin:/bin:/usr/sbin:/usr/bin" #Ne pas toucher

test -x $DAEMON || exit 0

. /lib/lsb/init-functions

d_start () {
        log_daemon_msg "Starting system $daemon_NAME Daemon"
        start-stop-daemon --background --name $daemon_NAME --start --quiet --chuid $DAEMONUSER --exec $DAEMON -- $daemon_OPT
        log_end_msg $?
}

d_stop () {
        log_daemon_msg "Stopping system $daemon_NAME Daemon"
        start-stop-daemon --name $daemon_NAME --stop --retry 5 --quiet --name $daemon_NAME
        log_end_msg $?
}

